package com.wangcanxuan.www.service.Impl;

import com.wangcanxuan.www.dao.mapper.TaskMapper;
import com.wangcanxuan.www.entity.dto.ResultInfo;
import com.wangcanxuan.www.entity.po.Task;
import com.wangcanxuan.www.entity.po.User;
import com.wangcanxuan.www.exception.ServiceException;
import com.wangcanxuan.www.proxy.DaoProxy;
import com.wangcanxuan.www.service.TaskService;
import com.wangcanxuan.www.util.SecurityUtil;
import com.wangcanxuan.www.util.ValidateUtil;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import static com.wangcanxuan.www.entity.dto.ResultConstants.SUCCESS_REQUEST_CODE;
import static com.wangcanxuan.www.service.constant.ServiceConstants.TASK_SIZE;

/**
 * 任务业务实现类
 *
 * @author HHLJ
 * @date 2022/04/08
 */
public class TaskServiceImpl implements TaskService {
    private final TaskMapper TASK_MAPPER = DaoProxy.getMapper(TaskMapper.class);

    @Override
    public ResultInfo<List<Task>> selectTaskList(String tribeId, int pageCount) {
        // 通过部落id和页码查询任务列表
        List<Task> tasks = TASK_MAPPER.selectTaskList(tribeId, pageCount);

        // 判断集合大小为0且页码为0时，返回空集合
        if (tasks.size() == 0 && pageCount == 0) {
            return new ResultInfo<>(SUCCESS_REQUEST_CODE.getCode(),tasks);
        }

        // 判断集合大小为0，返回拒绝信息
        if (tasks.size() == 0) {
            return ResultInfo.operateRejectWithMessage("这是尾页！");
        }

        // 已被接受的任务不展示
        List<Task> returnTasks = new ArrayList<>();
        for (Task task : tasks) {
            String acceptorId = task.getAcceptorId();
            if (ValidateUtil.strIsNullOrEmpty(acceptorId)) {
                returnTasks.add(task);
            }
        }
        return new ResultInfo<>(SUCCESS_REQUEST_CODE.getCode(),returnTasks);
    }


    @Override
    public ResultInfo<String> publishTask(String taskName, String taskContent, int level, User user) {
        // 创建任务对象，设置任务名和所属部落id
        Task task = new Task();
        task.setTaskName(taskName);
        task.setTribeId(user.getTribeId());
        Task selectTask = task;

        // 查询是否有任务名重复的任务
        selectTask = TASK_MAPPER.selectOneByFields(selectTask);

        // 判断是否查询到相关任务，返回拒绝结果
        if (selectTask != null) {
            return ResultInfo.operateRejectWithMessage("任务名重复，请更换任务名！");
        }

        // 设置当前用户id为发布者id，部落id
        selectTask = new Task();
        selectTask.setPublisherId(user.getId());
        selectTask.setTribeId(task.getTribeId());

        // 查询当前用户发布任务的集合
        List<Task> tasks = TASK_MAPPER.selectListByFields(selectTask);

        // 判断当前用户发布的任务数量是否等于5，返回拒绝信息
        if (tasks != null && tasks.size() == TASK_SIZE) {
            return ResultInfo.operateRejectWithMessage("最多发布五个任务！");
        }
        // 设置任务的信息
        task.setId(SecurityUtil.uuidCreateId());
        task.setContent(taskContent);
        task.setLevel(level);
        task.setPublisherId(user.getId());
        int insert = TASK_MAPPER.insert(task);
        if (insert != 1) {
            throw new ServiceException("发布任务功能异常！");
        }

        return new ResultInfo<>(SUCCESS_REQUEST_CODE.getCode());
    }

    @Override
    public ResultInfo<String> shelvesTask(String chooseTaskName, String tribeId) {
        // 查询被选择的任务的信息
        Task task = new Task();
        task.setTaskName(chooseTaskName);
        task.setTribeId(tribeId);
        task = TASK_MAPPER.selectOneByFields(task);

        // 判断当前任务是否已被完成，被完成后可下架该任务
        if ("".equals(SecurityUtil.getCountdownTime(task.getAcceptDate()))) {
            // 在数据库中删除该记录
            int delete = TASK_MAPPER.delete(task);
            if (delete != 1) {
                throw new ServiceException("下架任务功能异常！");
            }
            return new ResultInfo<>(SUCCESS_REQUEST_CODE.getCode());
        }
        // 判断任务已被接受，返回拒绝信息
        if (!ValidateUtil.strIsNullOrEmpty(task.getAcceptorId())) {
            return ResultInfo.operateRejectWithMessage("该任务已被接受，请耐心等待其被完成！");
        }
        // 在数据库中删除该记录
        int delete = TASK_MAPPER.delete(task);
        if (delete != 1) {
            throw new ServiceException("下架任务功能异常！");
        }

        return new ResultInfo<>(SUCCESS_REQUEST_CODE.getCode());
    }

    @Override
    public ResultInfo<List<Task>> selectTaskListByUser(User user) {
        // 通过发布者id和部落id，查询任务集合
        Task task = new Task();
        task.setPublisherId(user.getId());
        task.setTribeId(user.getTribeId());
        List<Task> tasks = TASK_MAPPER.selectListByFields(task);
        return new ResultInfo<>(SUCCESS_REQUEST_CODE.getCode(),tasks);
    }

    @Override
    public ResultInfo<String> acceptTask(User user, String chooseTaskName) {
        // 设置任务信息
        Task task = new Task();
        task.setTaskName(chooseTaskName);
        task.setTribeId(user.getTribeId());

        // 查询数据库中有无相关记录
        task = TASK_MAPPER.selectOneByFields(task);

        // 判断该任务是否自己发布的，返回拒绝结果
        if (task.getPublisherId().equals(user.getId())) {
            return ResultInfo.operateRejectWithMessage("不能接受自己的任务！");
        }

        // 判断该任务是否接受过，返回拒绝结果
        if (task.getAcceptorId() != null && task.getAcceptorId().equals(user.getId())) {
            return ResultInfo.operateRejectWithMessage("该任务已被接受！");
        }

        // 查询当前接受任务的数量
        Task selectTask = new Task();
        selectTask.setAcceptorId(user.getId());
        List<Task> tasks = TASK_MAPPER.selectListByFields(selectTask);

        // 判断当前接受任务的数量是否等于5，返回拒绝结果
        if (tasks != null && tasks.size() >= TASK_SIZE) {
            return ResultInfo.operateRejectWithMessage("最多接受五个任务！");
        }

        // 设置任务接受用户id和接受日期
        task.setAcceptDate(LocalDateTime.now());
        task.setAcceptorId(user.getId());

        // 插入到数据库
        int update = TASK_MAPPER.update(task);
        if (update != 1) {
            throw new ServiceException("接受任务功能异常！");
        }
        return new ResultInfo<>(SUCCESS_REQUEST_CODE.getCode());

    }
}